<?xml version="1.0"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
	<xsl:element name="Diagram">
		<xsl:attribute name="version">1.0</xsl:attribute>
		<xsl:attribute name="type">MSSQL</xsl:attribute>
		<xsl:attribute name="versionMajor">10</xsl:attribute>
		<xsl:attribute name="versionMinor">0</xsl:attribute>
		<xsl:attribute name="groupSchema">false</xsl:attribute>
	
		<xsl:apply-templates select="*/Entities/*" mode="entity"/>
		<xsl:apply-templates select="*/Entities/*/PK/*" mode="pk"/>
		<xsl:apply-templates select="*/Relations/*" mode="rels"/>		
		<xsl:apply-templates select="*/WorkSpaces/*" mode="sheets"/>
		
		<xsl:element name="Settings">
			<xsl:attribute name="sheet">190</xsl:attribute>
			<xsl:attribute name="zoom">1.0</xsl:attribute>			
		</xsl:element>
  </xsl:element>
</xsl:template>

<xsl:template match="*" mode="rels">
	<xsl:element name="Relation">
		<xsl:attribute name="name"><xsl:value-of select="Name"/></xsl:attribute>
		<xsl:attribute name="id"><xsl:value-of select="Id"/></xsl:attribute>
		<xsl:attribute name="cardinality"><xsl:value-of select="CardinalityChild"/></xsl:attribute>
		<xsl:attribute name="identifying"><xsl:value-of select="Identifying=1"/></xsl:attribute>
		<xsl:attribute name="nulls">true</xsl:attribute>
		<xsl:element name="FK"><xsl:value-of select="ForeignKeys/*/AttrParent"/></xsl:element>
		<xsl:element name="PK"><xsl:value-of select="ForeignKeys/*/AttrChild"/></xsl:element>
		<xsl:element name="Text"><xsl:value-of select="Notes"/><xsl:value-of select="Comments"/></xsl:element>
	</xsl:element>
</xsl:template>

<xsl:template match="*" mode="sheets">
	<xsl:element name="Sheet">
		<xsl:attribute name="name"><xsl:value-of select="Name"/></xsl:attribute>
		<xsl:attribute name="id"><xsl:value-of select="Id"/></xsl:attribute>
		<xsl:attribute name="disp_at">true</xsl:attribute>
		<xsl:attribute name="disp_ph">true</xsl:attribute>
		<xsl:attribute name="disp_co">true</xsl:attribute>
		<xsl:attribute name="disp_rn">true</xsl:attribute>
		<xsl:apply-templates select="ShapeList/*" mode="sheetShape"/>
	</xsl:element>
</xsl:template>

<xsl:template match="*" mode="sheetShape">
	<xsl:element name="Place">
		<xsl:attribute name="id"><xsl:value-of select="ParentBaseID"/></xsl:attribute>
		<xsl:attribute name="visible">true</xsl:attribute>
		<xsl:value-of select="round(Left div 2)"/>,<xsl:value-of select="round(Top div 2)"/>,<xsl:value-of select="round(Width div 2)"/>,<xsl:value-of select="round(Height div 2)"/>
	</xsl:element>
</xsl:template>

<xsl:template match="*" mode="pk">
	<xsl:variable name="tmp"><xsl:value-of select="."/></xsl:variable>
	<xsl:apply-templates select="../../Keys/*[Id=$tmp]" mode="_pk"/>
</xsl:template>

<xsl:template match="*" mode="_pk">
	<xsl:element name="Constraint">
		<xsl:attribute name="table"><xsl:value-of select="../../Id"/></xsl:attribute>
		<xsl:attribute name="name"><xsl:value-of select="Name"/></xsl:attribute>
		<xsl:attribute name="type">PrimKey</xsl:attribute>
		<xsl:element name="ConstraintColumn">
			<xsl:attribute name="id"><xsl:value-of select="KeyItems/*/Attribute/Id"/></xsl:attribute>
		</xsl:element>
	</xsl:element>
</xsl:template>

<xsl:template match="*" mode="entity">
	<xsl:element name="Table">
		<xsl:attribute name="id"><xsl:value-of select="Id"/></xsl:attribute>
		<xsl:attribute name="name"><xsl:value-of select="Name"/></xsl:attribute>
		<xsl:attribute name="schema"></xsl:attribute>
		<xsl:attribute name="database"></xsl:attribute>
		<xsl:apply-templates select="Attributes/*" mode="attribute"/>
	</xsl:element>
</xsl:template>

<xsl:template match="*" mode="attribute">
	<xsl:element name="Column">
		<xsl:attribute name="id"><xsl:value-of select="Id"/></xsl:attribute>
		<xsl:attribute name="name"><xsl:value-of select="Name"/></xsl:attribute>
		<xsl:attribute name="type"><xsl:apply-templates select="DataType/Id" mode="resolveDataType"/></xsl:attribute>
		<xsl:attribute name="length"><xsl:value-of select="DataTypeParam1"/></xsl:attribute>
		<xsl:attribute name="nulls"><xsl:value-of select="NotNull=0"/></xsl:attribute>
		<xsl:variable name="kc"><xsl:value-of select="KeyConstraintItems/Id"/></xsl:variable>
		<xsl:variable name="pk"><xsl:value-of select="../../PK/Id"/></xsl:variable>
		<xsl:if test="../../Keys/*[Id=$pk]/KeyItems/*[Id=$kc]">
			<xsl:call-template name="IDColumn"/>
		</xsl:if>
		<xsl:apply-templates select="Notes" mode="notes"/>
		<xsl:apply-templates select="DefaultValue" mode="defValue"/>
	</xsl:element>
</xsl:template>

<xsl:template match="*" mode="resolveDataType">
	<xsl:choose>
		<xsl:when test=".='{49EDF355-10D8-4DE9-AC9D-66F7192935E8}'">uniqueidentifier</xsl:when>	
		<xsl:when test=".='{F881DE4A-9AAB-4929-813E-6B1E664977DF}'">int</xsl:when>	
		<xsl:when test=".='{2F7B3FF4-D340-4DB3-8653-62A186D3CA52}'">nvarchar</xsl:when>	
		<xsl:when test=".='{4952AA3A-01E7-4FBD-AE16-536C2F541FD8}'">datetime</xsl:when>	
		<xsl:when test=".='{54028189-EFD2-4EAB-B4B2-89496512CD08}'">varchar</xsl:when>
		<xsl:when test=".='{FC722160-3777-43BF-A883-62EA0425B3CB}'">bit</xsl:when>
		<xsl:otherwise></xsl:otherwise>
	</xsl:choose>
</xsl:template>

<xsl:template match="*" mode="defValue">
	<xsl:element name="CP">
		<xsl:attribute name="name">DEFAULT_VALUE</xsl:attribute>
		<xsl:value-of select="."/>
	</xsl:element>
</xsl:template>

<xsl:template match="*" mode="notes">
	<xsl:element name="CP">
		<xsl:attribute name="name">COMMENTS</xsl:attribute>
		<xsl:value-of select="."/>
	</xsl:element>
</xsl:template>

<xsl:template name="IDColumn">
	<xsl:element name="CP">
		<xsl:attribute name="name">IDENTITY</xsl:attribute>
		<xsl:text>YES</xsl:text>
	</xsl:element>
	<xsl:element name="CP">
		<xsl:attribute name="name">ISROWGUIDCOL</xsl:attribute>
		<xsl:text>YES</xsl:text>
	</xsl:element>	
</xsl:template>

</xsl:stylesheet>
